package chapter18;

import java.io.File;
import java.io.IOException;
/**
 * 	处理文件的通用类
 * @author 黄传伟  2018年7月15日
 *
 */
public class ProcessFile {
	
	private ProcessStrategy strategy;
	//要处理的文件扩展名
	private String ext;
	/**
	 * 	处理策略
	 * @author 黄传伟  2018年7月15日
	 *
	 */
	@FunctionalInterface
	public interface ProcessStrategy{
		void process(File f);
	}
	
	/**
	 * 	构造器,必须传入处理策略;
	 * 
	 * @param strategy
	 * @param ext 要处理的文件扩展名,null表示处理任何文件
	 */
	public ProcessFile(ProcessStrategy strategy, String ext) {
		this.strategy = strategy;
		this.ext = ext;
	}
	
	/**
	 * 
	 * 	开始处理文件,处理给定参数代表的文件或目录;
	 * 	处理直接参数中的文件
	 *  chuanwei.huang
	 */
	public void process(String [] args) {
		//如果参数为空,则默认处理当前目录
		if(args != null || args.length == 0)
			processDirtoryTree(new File("."));
		else
			for(String path: args) {
				File file = new File(path);
				if(file.isDirectory())
					processDirtoryTree(file);
				else {
					if(!path.endsWith("." + ext))
						path += "." + ext;
					try {
						strategy.process(new File(path).getCanonicalFile());
					} catch (IOException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
					
			}
		
	}
	
	/**
	 * 	真正处理目录的函数 
	 * @param path
	 *     黄传伟	2018年7月16日
	 */
	private void processDirtoryTree(File root) {
		for(File file: Directory.TreeInfo.walk(root, ".*\\." + this.ext + "$")) {
			strategy.process(file);
		}
	}
	
	public static void main(String[] args) {
		new ProcessFile((File f) -> {
			try {
				System.out.println(f.getCanonicalPath());
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}, "java").process(args);
	}
}
